package middle

import (
	"github.com/gin-gonic/gin"
	"k8s-platform/utils"
	"net/http"
	"strings"
)

// jwt中间件，用于验证token

//func JWTAuth() gin.HandlerFunc {
//	return func(c *gin.Context) {
//		//对登录接口放行
//		if len(c.Request.URL.String()) >= 10 && c.Request.URL.String()[0:10] == "/api/login" {
//			c.Next()
//		} else {
//			if len(c.Request.URL.String()) >= 10 && c.Request.URL.String()[0:13] == "/api/node/ssh" {
//				// 检查Sec-Fetch-Mode是否为websocket
//				fetchMode := c.Request.Header.Get("Sec-Fetch-Mode")
//				if fetchMode != "websocket" {
//					c.JSON(http.StatusBadRequest, gin.H{
//						"msg":  "请求不是WebSocket连接",
//						"data": nil,
//					})
//					c.Abort()
//					return
//				}
//				c.Next()
//			}
//			token := c.Request.Header.Get("Authorization")
//			if token == "" {
//				c.JSON(http.StatusBadRequest, gin.H{
//					"msg":  "请求未携带token，无权限访问",
//					"data": nil,
//				})
//				c.Abort()
//				return
//			}
//			claims, err := utils.JWTToken.ParseToken(token)
//			if err != nil {
//				c.JSON(http.StatusBadRequest, gin.H{
//					"msg":  err.Error(),
//					"data": err.Error(),
//				})
//				c.Abort()
//				return
//			}
//			c.Set("claims", claims)
//		}
//	}
//}

//func JWTAuth() gin.HandlerFunc {
//	return func(c *gin.Context) {
//		// 对登录接口放行
//		if len(c.Request.URL.String()) >= 10 && c.Request.URL.String()[0:10] == "/api/login" {
//			c.Next()
//		} else {
//			if len(c.Request.URL.String()) >= 13 && c.Request.URL.String()[0:13] == "/api/node/ssh" {
//				// 检查 Sec-Fetch-Mode 是否为 websocket
//				fetchMode := c.Request.Header.Get("upgrade")
//				if fetchMode != "websocket" {
//					c.JSON(http.StatusBadRequest, gin.H{
//						"msg":  "请求不是 WebSocket 连接",
//						"data": nil,
//					})
//					c.Abort()
//					return
//				}
//				// 从 Sec-WebSocket-Protocol 头中获取 token
//				protocols := c.Request.Header.Get("Sec-WebSocket-Protocol")
//				var token string
//				if protocols != "" {
//					// 假设 token 是以 token- 开头的协议
//					part := strings.Split(protocols, ", ")
//					for _, part := range part {
//						if strings.HasPrefix(part, "token-") {
//							token = strings.TrimPrefix(part, "token-")
//							break
//						}
//					}
//				}
//				if token == "" {
//					c.JSON(http.StatusBadRequest, gin.H{
//						"msg":  "请求未携带 token，无权限访问",
//						"data": nil,
//					})
//					c.Abort()
//					return
//				}
//				// 验证 token
//				claims, err := utils.JWTToken.ParseToken(token)
//				if err != nil {
//					c.JSON(http.StatusBadRequest, gin.H{
//						"msg":  err.Error(),
//						"data": err.Error(),
//					})
//					c.Abort()
//					return
//				}
//				c.Set("claims", claims)
//			}
//		}
//		c.Next()
//	}
//}

func JWTAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 对登录接口放行
		if strings.HasPrefix(c.Request.URL.String(), "/api/login") {
			c.Next()
			return // 放行后直接返回，避免后续验证
		}

		// 处理WebSocket连接(/api/node/ssh)
		if strings.HasPrefix(c.Request.URL.String(), "/api/node/ssh") {
			// 检查是否为WebSocket连接
			fetchMode := c.Request.Header.Get("Upgrade")
			if fetchMode != "websocket" {
				c.JSON(http.StatusBadRequest, gin.H{
					"msg":  "请求不是 WebSocket 连接",
					"data": nil,
				})
				c.Abort()
				return
			}

			// 从Sec-WebSocket-Protocol头中获取token
			protocols := c.Request.Header.Get("Sec-WebSocket-Protocol")
			var token string
			if protocols != "" {
				parts := strings.Split(protocols, ", ")
				for _, part := range parts {
					if strings.HasPrefix(part, "token-") {
						token = strings.TrimPrefix(part, "token-")
						break
					}
				}
			}

			if token == "" {
				c.JSON(http.StatusUnauthorized, gin.H{ // 注意使用401状态码
					"msg":  "请求未携带 token，无权限访问",
					"data": nil,
				})
				c.Abort()
				return
			}

			// 验证token
			claims, err := utils.JWTToken.ParseToken(token)
			if err != nil {
				c.JSON(http.StatusUnauthorized, gin.H{ // 注意使用401状态码
					"msg":  err.Error(),
					"data": nil,
				})
				c.Abort()
				return
			}

			c.Set("claims", claims)
			c.Next()
			return
		}

		// 处理其他所有需要token验证的接口
		// 从Authorization头获取token
		authHeader := c.Request.Header.Get("Authorization")
		if authHeader == "" {
			c.JSON(http.StatusUnauthorized, gin.H{
				"msg":  "请求未携带 token，无权限访问",
				"data": nil,
			})
			c.Abort()
			return
		}

		// 检查Authorization格式(Bearer token)
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			c.JSON(http.StatusUnauthorized, gin.H{
				"msg":  "token格式错误",
				"data": nil,
			})
			c.Abort()
			return
		}

		// 验证token
		claims, err := utils.JWTToken.ParseToken(parts[1])
		if err != nil {
			c.JSON(http.StatusUnauthorized, gin.H{
				"msg":  err.Error(),
				"data": nil,
			})
			c.Abort()
			return
		}

		c.Set("claims", claims)
		c.Next()
	}
}
